# -*- coding: utf-8 -*-
"""
------------------------------------------------------------------------------
    File Name:  embedding_demo
    Author   :  wanwei1029
    Date     :  2018-10-12
    Desc     :  注意，embedding的作用，是将一个正整数，转换为指定大小的二维向量。
        用作nlp时，一般会将词编码成整数，然后再通过embedding转换成向量。
------------------------------------------------------------------------------
"""
from keras.models import Sequential
from keras.layers.embeddings import Embedding
import numpy as np
import samp.samp_logging as sl

logger = sl.get_logger("embedding_demo")


def demo():
    """
    Embedding层只能作为模型的第一层
    模型输入：是一个2维tensor，shape为(batch_size,sequence_length)
    模型输出：是一个3维tensor，shape为(batch_size,sequence_length,output_dim)
    Embedding参数：
    input_dim：词汇向量的最大值,一般在最大值上加1
    output_dim：将输入中每个句子的每个词所代表的数字，拆分成output_dim个数字
    input_length：输入元素的长度，也就是一句话包含多少个词项（取最大的）。
        一般取词汇最长的句子的长度（sequence_length），其它的句子不够长的填充。
        例如：三个输入词：张三,李四,王五，向量化为：531 947 921，我们定义的Embedding模型为：Embedding(1000, 10, input_length=3)
        经过模型转化为，531 会变成一个1*10的数组，947 921也类似，最终结果会转换成一个1*3*10的数组。
    weights: 用于初始化权值的numpy arrays组成的list。这个List至少有1个元素，shape为(input_dim, output_dim)
    """
    max_sentence_length = 7
    output_dim = 8
    max_word_index = 10
    model = Sequential()
    data_batch = 2
    model.add(Embedding(max_word_index+1, output_dim, input_length=max_sentence_length))
    input_array = np.random.randint(max_word_index, size=(data_batch, max_sentence_length))
    print(input_array)
    model.compile('rmsprop', 'mse')
    output_array = model.predict(input_array)
    print(output_array)


if __name__ == '__main__':
    test_method = "demo"
    if test_method == "demo":
        demo()
